// import { Options } from 'sequelize';
// import { Sequelize } from 'sequelize-typescript';

// export class DatabaseManager {
//   private static manager?: DatabaseManager;
//   private dbInstance?: Sequelize;
//   private dbInstanceMap?: Map<string, Sequelize> = new Map<string, Sequelize>();
//   private dbConfig?: Options;
//   private dbConfigs?: Options[] = [];
//   private constructor(dbConfig: Options);
//   private constructor(dbConfigs: Options[]);
//   private constructor(arg: Options & Options[]) {
//     if (Array.isArray(arg)) {
//       this.dbConfigs = arg;
//       return;
//     }
//     this.dbConfig = arg;
//   }
//   public static getInstance(dbConfig: Options & Options[]): DatabaseManager {
//     if (!DatabaseManager.manager) {
//       DatabaseManager.manager = new DatabaseManager(dbConfig);
//     }
//     return DatabaseManager.manager;
//   }

//   public async initDbInstance(models: string): Promise<void> {
//     if (!this.dbConfig) {
//       throw new Error('db配置错误,请检查');
//     }
//     try {
//       if (this.dbInstance) await this.dbInstance.close();
//       this.dbInstance = new Sequelize(this.dbConfig);
//       await this.dbInstance.authenticate();
//       this.dbInstance.addModels([models]);
//       await this.dbInstance.sync();
//     } catch (error) {
//       throw new Error(`数据源初始化失败${error}`);
//     }
//   }
//   public async initDbInstances(models: string[]): Promise<void> {
//     if (this.dbInstanceMap && this.dbInstanceMap.size) {
//       for (const [databaseName, dbInstance] of this.dbInstanceMap.entries()) {
//         await dbInstance.close();
//         this.dbInstanceMap.delete(databaseName);
//       }
//     }
//     const databases: string[] = [];
//     if (!this.dbConfigs) {
//       throw new Error(`dbConfigs`);
//     }
//     for (let i = 0; i < this.dbConfigs.length; i++) {
//       const config = this.dbConfigs[i];
//       if (!config.database) {
//         continue;
//       }
//       if (databases.includes(config.database)) {
//         continue;
//       }
//       databases.push(config.database);
//       if (!this.dbInstanceMap) {
//         throw new Error('dbMap');
//       }
//       try {
//         const instance = new Sequelize(config);
//         await instance.authenticate();
//         instance.addModels([models[i]]);
//         await instance.sync();
//         this.dbInstanceMap.set(config.database, instance);
//       } catch (error) {
//         throw new Error(`数据源初始化失败${error}`);
//       }
//     }
//   }

//   public async setDbConfig(dbConfig: Options, models: string): Promise<void> {
//     this.dbConfig = dbConfig;
//     await this.initDbInstance(models);
//     console.info('切换数据源成功');
//   }
//   public async setDbConfigs(
//     dbConfigs: Options[],
//     models: string[],
//   ): Promise<void> {
//     this.dbConfigs = dbConfigs;
//     await this.initDbInstances(models);
//     console.info('切换数据源成功');
//   }
//   public getDbConfig(): Options | undefined {
//     return this.dbConfig;
//   }
//   public getDbConfigs(): Options[] | undefined {
//     return this.dbConfigs;
//   }
//   public getDbInstance(dbName?: string): Sequelize | undefined {
//     if (dbName) {
//       if (this.dbInstanceMap && !this.dbInstanceMap.size) {
//         throw new Error('请初始化数据源!');
//       }
//       // if (!this.dbInstanceMap) {
//       //   throw new Error('请初始化数据源!');
//       // }
//       return this.dbInstanceMap?.get(dbName);
//     }
//     if (!this.dbInstance) {
//       throw new Error('请初始化数据源!');
//     }
//     return this.dbInstance;
//   }
//   public getAllDbInstance(): Map<string, Sequelize> {
//     if (!this.dbInstanceMap?.size) {
//       throw new Error('请先初始化数据源!');
//     }
//     return this.dbInstanceMap;
//   }
//   public close(dbName?: string): void {
//     if (!this.dbInstanceMap) {
//       throw new Error('请先初始化数据源!');
//     }
//     if (dbName) {
//       this.dbInstanceMap?.get(dbName);
//       // if (!this.dbInstanceMap) return;
//       this.dbInstanceMap.get(dbName)?.close();
//       return;
//     }
//     this.dbInstance && this.dbInstance.close();
//   }
// }
// export default DatabaseManager;
